package controllers

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"

	"dcarpai-guider/internal/models"
	"dcarpai-guider/internal/services"
)

// AuthController 认证控制器
type AuthController struct {
	userService *services.UserService
	logger      *zap.Logger
}

// NewAuthController 创建新的认证控制器
func NewAuthController(userService *services.UserService, logger *zap.Logger) *AuthController {
	return &AuthController{
		userService: userService,
		logger:      logger,
	}
}

// Login 用户登录
// @Summary 用户登录
// @Description 用户登录接口，返回JWT token
// @Tags 认证
// @Accept json
// @Produce json
// @Param login body models.UserLogin true "登录信息"
// @Success 200 {object} models.LoginResponse
// @Failure 400 {object} map[string]interface{}
// @Failure 401 {object} map[string]interface{}
// @Router /auth/login [post]
func (ac *AuthController) Login(c *gin.Context) {
	var req models.UserLogin
	if err := c.ShouldBindJSON(&req); err != nil {
		ac.logger.Warn("登录请求参数错误", zap.Error(err))
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    400,
			"message": "请求参数错误",
			"error":   err.Error(),
		})
		return
	}

	// 基本验证
	if req.Username == "" || req.Password == "" {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    400,
			"message": "用户名和密码不能为空",
		})
		return
	}

	// 调用用户服务进行登录
	response, err := ac.userService.Login(req.Username, req.Password)
	if err != nil {
		ac.logger.Warn("用户登录失败",
			zap.String("username", req.Username),
			zap.Error(err),
		)
		c.JSON(http.StatusUnauthorized, gin.H{
			"code":    401,
			"message": err.Error(),
		})
		return
	}

	ac.logger.Info("用户登录成功",
		zap.String("username", req.Username),
		zap.String("role", response.User.Role),
	)

	c.JSON(http.StatusOK, gin.H{
		"code":    200,
		"message": "登录成功",
		"data":    response,
	})
}

// GetProfile 获取用户信息
// @Summary 获取用户信息
// @Description 获取当前登录用户的详细信息
// @Tags 用户
// @Produce json
// @Security BearerAuth
// @Success 200 {object} models.UserResponse
// @Failure 401 {object} map[string]interface{}
// @Failure 404 {object} map[string]interface{}
// @Router /users/profile [get]
func (ac *AuthController) GetProfile(c *gin.Context) {
	// 从中间件中获取用户ID
	userID, exists := c.Get("user_id")
	if !exists {
		c.JSON(http.StatusUnauthorized, gin.H{
			"code":    401,
			"message": "未找到用户信息",
		})
		return
	}

	userIDInt, ok := userID.(int)
	if !ok {
		c.JSON(http.StatusInternalServerError, gin.H{
			"code":    500,
			"message": "用户ID格式错误",
		})
		return
	}

	// 获取用户信息
	profile, err := ac.userService.GetUserProfile(userIDInt)
	if err != nil {
		ac.logger.Error("获取用户信息失败",
			zap.Int("user_id", userIDInt),
			zap.Error(err),
		)
		c.JSON(http.StatusNotFound, gin.H{
			"code":    404,
			"message": "用户不存在",
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"code":    200,
		"message": "获取用户信息成功",
		"data":    profile,
	})
}

// Logout 用户登出
// @Summary 用户登出
// @Description 用户登出接口（客户端清除token即可）
// @Tags 认证
// @Produce json
// @Security BearerAuth
// @Success 200 {object} map[string]interface{}
// @Router /auth/logout [post]
func (ac *AuthController) Logout(c *gin.Context) {
	// 记录登出操作
	if username, exists := c.Get("username"); exists {
		ac.logger.Info("用户登出", zap.String("username", username.(string)))
	}

	// JWT是无状态的，实际的登出由客户端清除token完成
	c.JSON(http.StatusOK, gin.H{
		"code":    200,
		"message": "登出成功",
	})
}
